﻿using System;
using System.Disposables;
using System.Runtime.InteropServices;
using System.Windows.Controls;
using Collab.Modules.Editor.ViewModels;
using Collab.Modules.Session;
using EnvDTE80;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.TextManager.Interop;

namespace Collab.Collab_Modules_VSPackage
{
    /// <summary>
    /// This class implements the tool window exposed by this package and hosts a user control.
    ///
    /// In Visual Studio tool windows are composed of a frame (implemented by the shell) and a pane, 
    /// usually implemented by the package implementer.
    ///
    /// This class derives from the ToolWindowPane class provided from the MPF in order to use its 
    /// implementation of the IVsUIElementPane interface.
    /// </summary>
    [Guid("6da3acd8-5de7-434a-8cbf-5fc54e5d43bc")]
    public class CollabToolWindow : ToolWindowPane
    {
        private readonly CompositeDisposable disposable = new CompositeDisposable();
        private DTE2 dte;
        private CollaborationSessionFactory controller;
        private UserControl view;
        
        
        /// <summary>
        /// Standard constructor for the tool window.
        /// </summary>
        public CollabToolWindow() :
            base(null)
        {
            // Set the window title reading it from the resources.
            this.Caption = Resources.ToolWindowTitle;
            // Set the image that will appear on the tab of the window frame
            // when docked with an other window
            // The resource ID correspond to the one defined in the resx file
            // while the Index is the offset in the bitmap strip. Each image in
            // the strip being 16x16.
            this.BitmapResourceID = 301;
            this.BitmapIndex = 1;
            this.view = new CollaborationControl();
            base.Content = this.view;
        }

        public override void OnToolWindowCreated()
        {
            base.OnToolWindowCreated();
            this.dte = GetService(typeof(SDTE)) as DTE2;
            IVsTextManager textManager = (IVsTextManager)GetService(typeof(SVsTextManager));
            //this.tracker = new DocumentTracker(this.dte, textManager);

            // This is the user control hosted by the tool window; Note that, even if this class implements IDisposable,
            // we are not calling Dispose on this object. This is because ToolWindowPane calls Dispose on 
            // the object returned by the Content property.
            this.controller = new CollaborationSessionFactory(this.dte, textManager);
            this.view.DataContext = new CollaborationControlViewModel(this.controller);
            this.disposable.Add(this.view.DataContext as IDisposable);
        }

        protected override void OnClose()
        {
            base.OnClose();
            this.disposable.Dispose();
        }

        
    }
}
